/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package clases;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.struts.upload.FormFile;

/**
 * @Author Gimbet
 * Indicador de menor nivel que depende de datos de una matriz
 */
public class Indicador extends Root implements Reportable {

    	private int idIndicador;
        private String nombre ="";
        private String operacion=""; // (Enum de sum, max , min)
	private IndicadorElementos elementos; // Otra posibilidad es que
                                            //los elementos sean un ArrayList
                                            //pero todos relacionados bajo la
                                            //misma operacion
	private String ano ="";
        private String trimestre ="";
        private String tipo= "";
        private Integer valor;
        private FormFile archivo;

    public String getAno() {
        return ano;
    }

    public void setAno(String ano) {
        this.ano = ano;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public String getTrimestre() {
        return trimestre;
    }

    public void setTrimestre(String trimestre) {
        this.trimestre = trimestre;
    }


    public IndicadorElementos getElementos() {
        return elementos;
    }

    public void setElementos(IndicadorElementos elementos) {
        this.elementos = elementos;
    }

    public String getOperacion() {
        return operacion;
    }

    public void setOperacion(String operacion) {
        this.operacion = operacion;
    }

    public Integer getValor() {
        return valor;
    }

    public void setValor(Integer valor) {
        this.valor = valor;
    }

    public FormFile getArchivo() {
        return archivo;
    }

    public void setArchivo(FormFile archivo) {
        this.archivo = archivo;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public int getIdIndicador() {
        return idIndicador;
    }

    public void setIdIndicador(int idIndicador) {
        this.idIndicador = idIndicador;
    }
    
    /** Al obtener el valor de los IndicadorTotalizacion, realiza la operacion sobre
     * ellos por medio de IndicadorElementos y produce el valor correspondiente.
     * 
     */
    public double calcular(){
        return this.getElementos().calcular();
    }

    @Override
    public void imprimirArchivoDoc(FileOutputStream f) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void imprimirArchivoTabla(FileOutputStream f) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void extraerInformacion(ArrayList<Totalizacion> totalizaciones) {
        try {
            byte[] datos = this.archivo.getFileData();
            String informacion = new String(datos);
            String [] nombreYFormula = informacion.split("\n");
            String [] nombre = nombreYFormula[0].split(":");
            this.nombre = nombre[1];
            String[] formula = nombreYFormula[1].split(":");

 
            Pattern p = Pattern.compile("([a-zA-Z]+(\\s[a-zA-Z]+)*)+([^\\w])([a-zA-Z]+(\\s[a-zA-Z]+)*)*([0-9]*)\\s([^\\w])\\s([0-9]*).*");
            // Nombre de totalizacion Operacion (Totalizacion) Operacion numero
            Matcher m = p.matcher(formula[1]);

            if (m.find()) {
                System.out.println("entre a find");
                System.out.println(m.group(1)); //Primera totalizacion
                System.out.println(m.group(3)); //Operacion 1
                System.out.println(m.group(4)); //Segunda totalizacion (puede ser valor)
                System.out.println(m.group(5)); 
                System.out.println(m.group(6)); //espacio
                System.out.println(m.group(7)); // Operacion 2
                System.out.println(m.group(8)); // Valor
            }
            IndicadorElementos elemento = new IndicadorElementos();
            
            String totalizacion1 = m.group(1);
            String totalizacion2 = "";
            int intValor = 0;
            IndicadorTotalizacion indT = new IndicadorTotalizacion();
            if (m.group(4)== null){
                totalizacion2 = m.group(6);
               intValor = Integer.parseInt(totalizacion2);
             indT.setValor(intValor);   
            }
            else{
                totalizacion2 = m.group(4);
            }
         
            for (Totalizacion t: totalizaciones){
                String nombreT = t.getNombre();
                if (totalizacion1.equalsIgnoreCase(nombreT)){
                   indT.setTotalizacion1(t);
                   System.out.println("Totalizacion1: "+totalizacion1);
                }
                else if (totalizacion2.equalsIgnoreCase(nombreT)){
                   indT.setTotalizacion2(t);
                   System.out.println("Totalizacion2: "+totalizacion2);
                }
            }
            indT.setOperacion(m.group(3));
            if (indT.getTotalizacion1().getIdTotalizacion() != null && (indT.getTotalizacion2().getIdTotalizacion() != null || indT.getValor()> 0)){
                System.out.println("Entro en el if");
                elemento.setIndicadorTotalizacion1(indT);
                elemento.setValor(Integer.parseInt(m.group(8)));
                elemento.setOperacion(m.group(7));

                this.setElementos(elemento);
            }
            
        } catch (IOException ex) {
            Logger.getLogger(Indicador.class.getName()).log(Level.SEVERE, null, ex);
        }
                 
    }

}
